#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int test1();
int test2();

int main()
{
    int number = 1;
    //  =================================exit======================================
    // void exit(int status) 先清洗缓冲区，再结束进程
    // status 退出值 0表示正常退出 非0表示异常退出 其他程序可以获取到这个值
    // return 0 | exit() 会清理缓冲区，然后结束进程
    if (number == 1)
    {
        printf("hello");
        // exit(0);
        return 0;
        printf("world");
    }
    // 打印hello linux系统是行缓冲遇到\n打印

    //  ============================_exit|_Exit=====================================
    // _Exit() | _exit() 不会清洗缓冲区，直接结束进程
    if (number == 2)
    {
        printf("hello");
        // _Exit(0);
        _exit(0);
        printf("world");
    }
    // 不会打印出内容

    // ============================return 0 & exit=====================================
    // return 0 表示结束函数 exit表示结束进程
    // 在main函数中return 0和exit(0)效果一样  在函数中则不同
    if (number == 3)
    {
        printf("hello");
        // test1(); // 函数中return 0 结束test1函数, 打印helloworld
        test2(); // 函数中exit(0)结束进程, 打印hello
        printf("world");
    }
    // =============================================================================
    printf("main\n");

    pid_t pid = fork();
    if (pid == 0)
    {
        printf("child\n");
        exit(15);
        // sleep(30);
        printf("1111111\n"); // 不会执行
    }
    if (pid > 0)
    {
        printf("parent\n");
    }
    int status;
    wait(&status);
    // 判断子进程是否正常退出 如果正常退出WIFEXITED(status)为真
    if (WIFEXITED(status))
    {
        // 获取子进程的退出码
        printf("正常 child exit with %d\n", WEXITSTATUS(status));
    }
    // 判断子进程是否被信号杀死 如果被信号杀死WIFSIGNALED(status)为真
    if (WIFSIGNALED(status))    
    {
        // 获取子进程被杀死的信号值
        printf("杀死 child exit with signal %d\n", WTERMSIG(status));
    }
}
int test1()
{
    return 0;
}
int test2()
{
    exit(0);
}